package la.iok.hzsvn.lewin.movie.service;

import la.iok.hzsvn.lewin.movie.core.Token;
import la.iok.hzsvn.lewin.movie.core.model.MovieVo;
import la.iok.hzsvn.lewin.movie.entity.Movie;
import la.iok.hzsvn.lewin.movie.model.MovieParam;
import la.iok.hzsvn.lewin.mybatis.model.PageVo;
import la.iok.hzsvn.lewin.mybatis.service.BaseService;
import la.iok.hzsvn.share.annotations.NotNull;
import la.iok.hzsvn.share.annotations.NotNullElement;
import la.iok.hzsvn.share.annotations.Nullable;

import java.util.List;

public interface MovieService extends BaseService<Movie,Long> {
    /**
     * 保存剧本信息
     * @param movie 剧本信息
     * @return 新插入剧本id
     */
    Long save(@NotNull Token token, @NotNull MovieParam movie);

    /**
     * 更新剧本信息
     * @param id 剧本id
     * @param token 操作用户
     * @param movie 剧本信息
     */
    void update(@Nullable Long id, @NotNull Token token, @NotNull MovieParam movie);

    /**
     * 删除剧本
     * @param id 剧本id
     * @param token 操作用户
     */
    void delete(@Nullable Long id, @NotNull Token token);

    /**
     * 转换为视图对象
     * @param movie 实体对象
     * @return 视图对象
     */
    @NotNull
    MovieVo po2vo(@NotNull Movie movie);

    /**
     * 分页查询列表
     * @param name 名称,模糊查询
     * @param author 作者,模糊查询
     * @param tag 标签,模糊查询
     * @param minPlayers 最少玩家数量
     * @param maxPlayers 最多玩家数量
     * @param minDuration 最小时长
     * @param maxDuration 最多时长
     * @return 剧本列表
     */
    PageVo<MovieVo> page(int page, int limit, @Nullable String name, @Nullable String author, @Nullable String tag,
                         @Nullable Integer minPlayers, @Nullable Integer maxPlayers,
                         @Nullable Integer minDuration, @Nullable Integer maxDuration);

    /**
     * 验证用户对剧本的操作权限
     * @param token 登录用户
     * @param movieId 剧本id
     */
    @NotNull
    Movie validate(@NotNull Token token,@Nullable Long movieId);

    @NotNull
    @NotNullElement
    List<Long> unsupportedReturnMoneyMovies();
}
